#pragma once

#include<iostream>
#include<pthread.h>
#include"Mutex.hpp"

using namespace MutexModule;

namespace CondModule
{
    class Cond
    {
    public:
        Cond()
        {
            pthread_cond_init(&_cond,nullptr);      //初始化
        }

    //在条件变量下等，要把锁给释放掉，就把锁传进去，释放指定的锁
        void Wait(Mutex &mutex)
        {
            int n = pthread_cond_wait(&_cond,mutex.Get());    //让条件变量释放指定的锁，并在指定的条件变量下等待
            (void)n;
        }

        void Signal()
        {   
            //唤醒在条件变量下等待的一个线程
            int n = pthread_cond_signal(&_cond);      //只需要告知指定的条件变量下即可
            (void)n;
        }

        void Broadcast()
        {
            //唤醒所有该条件变量下等待的线程
            int n = pthread_cond_broadcast(&_cond);
            (void)n;
        }


        ~Cond()
        {
            pthread_cond_destroy(&_cond);
        }


    private:
        pthread_cond_t _cond;

    };

}


